#include "adb_device.h"

#include <stdlib.h>
#include <string.h>

void
sc_adb_device_destroy(struct sc_adb_device *device) {
    // 根据 sc_adb_device 的定义，有下面的几个char指针，所以要用free释放
    // free后，字段指针指向的位置就是垃圾数据了，而并不一定是NULL！    
    free(device->serial);
    free(device->state);
    free(device->model);
}

void
sc_adb_device_move(struct sc_adb_device *dst, struct sc_adb_device *src) {
    // 下面的赋值方式中，dst中的字段指针直接指向src中的字段指针处。    
    *dst = *src;
    // 此时src中的指针是不能free的，因为这个指针被dst使用了,指向NULL即可，退出函数就被回收了
    src->serial = NULL;
    src->state = NULL;
    src->model = NULL;
}

void
sc_adb_devices_destroy(struct sc_vec_adb_devices *devices) {
    for (size_t i = 0; i < devices->size; ++i) {
        // &devices->data[i]  等价于 &((devices->data)[i])
        // -> [] 优先级相同   ＆ 优先级次之   搜索“c语言运算符的优先级顺序”可以查看完整的列表分15级        
        sc_adb_device_destroy(&devices->data[i]);
    }
    sc_vector_destroy(devices);
}

enum sc_adb_device_type
sc_adb_device_get_type(const char *serial) {
    // strncmp函数为字符串比较函数，字符串大小的比较是以ASCII 码表上的顺序来决定，此顺序亦为字符的值。
    // 参考：https://baike.baidu.com/item/strncmp/5522625

    // Starts with "emulator-"
    if (!strncmp(serial, "emulator-", sizeof("emulator-") - 1)) {
        return SC_ADB_DEVICE_TYPE_EMULATOR;
    }

    // 在参数 str 所指向的字符串中搜索第一次出现字符 c（一个无符号字符）的位置
    
    // If the serial contains a ':', then it is a TCP/IP device (it is
    // sufficient to distinguish an ip:port from a real USB serial)
    if (strchr(serial, ':')) {
        return SC_ADB_DEVICE_TYPE_TCPIP;
    }

    return SC_ADB_DEVICE_TYPE_USB;
}
